package com.itheima.appserver;

import cn.hutool.core.util.RandomUtil;
import org.springframework.retry.annotation.Backoff;
import org.springframework.retry.annotation.Recover;
import org.springframework.retry.annotation.Retryable;
import org.springframework.stereotype.Service;

@Service
public class RetryService {


    /**
     * @Retryable 这个注解加在某个方法上
     * 如果这个方法抛出了指定的异常类型
     * 那么这个方法就会被进行自动重试
     * 如果重试次数都用完了 可以使用 @Recover 这个注解来指定一个默认的返回值
     * @Recover 这个注解修饰的方法的返回值必须和 @Retryable 这个注解修饰的方法的返回值是一致的
     *
     * 使用以上两个注解 必须要在启动类上面  添加  @EnableRetry
     */
    @Retryable(value = RuntimeException.class,   // 发生指定异常后才进行重试
            maxAttempts = 3,  // 最大的重试次数
            backoff = @Backoff(delay = 2000L, multiplier = 2) // 重试策略
    )
    public int execute(int max) {
        int data = RandomUtil.randomInt(1, 99);
        System.out.println("生成：" + data);
        if (data < max) {
            throw new RuntimeException();
        }
        return data;
    }

    @Recover // 如果重试次数用完了 默认返回这个数据 相当于Dubbo中的服务降级 备用方案
    public int recover(Exception e) {
        System.out.println("全部重试完成。。。。。");
        return 88; //返回默认
    }

}